// 从根节点开始递归处理找到最大值
// f[i][0]表示不选择该员工的最大快乐数
// f[1][1]表示选择该员工的最大快乐数

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
const int N = 6010;
// 存储每个结点的快乐值
int happy[N];
// 邻接表存储图
int h[N], e[N], ne[N], idx;
// 还需要能够找到树的根节点
bool no_root[N];
int f[N][2];
int n;

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int root)
{
    f[root][0] = 0, f[root][1] = happy[root];
    for (int i = h[root]; ~i; i = ne[i])
    {
        int j = e[i];
        dfs(j);
        f[root][0] += max(f[j][0], f[j][1]);
        f[root][1] += f[j][0];
    }
}

int main()
{
    memset(h, -1, sizeof h);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> happy[i];
    for (int i = 1; i < n; ++i)
    {
        int a, b;
        cin >> a >> b;
        add(b, a);
        no_root[a] = true;
    }
    int root = 1;
    // 找到根结点
    while (no_root[root])
        ++root;
    // 从根结点开始dfs
    dfs(root);
    cout << max(f[root][0], f[root][1]) << endl;
    return 0;
}
